package com.freejava.myblog.services;

import com.freejava.myblog.pojo.MyArticle;
import com.freejava.myblog.pojo.MySworder;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.regex.Pattern;

@Service
public class SworderService {

    @Autowired
    MongoTemplate mongoTemplate;

    /**
     * 添加一个剑客
     * @param mySworder
     * @return
     */
    public boolean add(MySworder mySworder) {
        long unixTime = System.currentTimeMillis() / 1000L;
        int nowUnixTime = (int) unixTime;
        mySworder.setCreated(nowUnixTime);
        /**
         * 语法：<T> T mongoTemplate.save(T objectToSave)
         * save方法用于保存数据对象，传递定义好的JavaBean即可，被保存的数据对象会作为返回值被返回。
         * 类似地，使用insert也可以达到保存数据的作用。
         */
        MySworder obj = mongoTemplate.save(mySworder);
        if (obj.getId() != null) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取所有剑客数据
     * @return
     */
    public List<MySworder> findAll() {
        /**
         * 语法：<T> List<T> findAll(Class<T> entityClass)
         * finAll会返回所有entityClass对应的数据集合的数据，相当于MySQL中select * from xxx_table_name。
         */
        return mongoTemplate.findAll(MySworder.class);
    }


    public boolean update(MySworder mySworder) {
        // 创建查询对象
        Query query = Query.query(Criteria.where("id").is(mySworder.getId()));
        Update update = new Update();
        update.set("name", mySworder.getName());
        update.set("description", mySworder.getDescription());
        update.set("skill", mySworder.getSkill());

        /**
         * 语法：public UpdateResult updateFirst(Query query, UpdateDefinition update, Class<?> entityClass)
         * updateFirst用于更新第一个被匹配的数据，query参数是查询条件对象，update是需要更新的数据对象，entityClass就是对应的JavaBean对象（文档集合类）
         */
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MyArticle.class);
        if (updateResult.getModifiedCount() > 0) {
            return true;
        } else {
            return false;
        }
    }

    public boolean updateBatchByKeyWords(String searchKey,String replaceString) {
        // 创建模糊查询对象
        Pattern pattern = Pattern.compile("^.*" + searchKey + ".*$", Pattern.CASE_INSENSITIVE);
        Criteria criteria = Criteria.where("description").regex(pattern);
        Update update = new Update();
        update.set("description", replaceString);
        Query query = new Query();
        query.addCriteria(criteria);

        /**
         * 语法：public UpdateResult updateMulti(Query query, UpdateDefinition update, Class<?> entityClass)
         * updateMulti用于所有被匹配的数据，query参数是查询条件对象，update是需要更新的数据对象，entityClass就是对应的JavaBean对象（文档集合类）
         */
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, MySworder.class);
        if (updateResult.getModifiedCount() > 0) {
            return true;
        } else {
            return false;
        }
    }

    public boolean delete(String id) {
        MySworder mySworder = new MySworder();
        mySworder.setId(id);
        /**
         * 语法： DeleteResult remove(Object object)
         * 该方法用于删除数据，一般都是传递一个主键ID即可
         */
        DeleteResult deleteResult = mongoTemplate.remove(mySworder);
        if (deleteResult.getDeletedCount() > 0) {
            return true;
        } else {
            return false;
        }
    }

    public MySworder details(String id) {
        Query query = Query.query(Criteria.where("id").is(id));
        /**
         * <T> T findOne(Query query, Class<T> entityClass)
         *
         * findOne就是根据查询条件(query）获取一条数据。
         */
        return mongoTemplate.findOne(query, MySworder.class);
    }

}
